# U obradi slike često se javlja potreba za takozvanim histogramom slike. Histogram slike predstavlja grafički
# prikaz koliko je piksela naše slike određenog intenziteta (bilo da se radi o RGB slikama, crno-belim slikama,
# slikama u intenzitetima sive boje itd.). Histogram kao takav često predstavlja gradivni element algoritama za
# segmentaciju slike, izdvajanje objekata na slici (npr. izdvajanje teksta od pozadine), popravku kvaliteta slike itd.
#Pre svega, potrebno je izvršiti instaliranje odgovarajućeg paketa za rad sa histogramom slike
import Pkg;
Pkg.add("ImageContrastAdjustment");
using ImageContrastAdjustment, TestImages, Images, Plots
my_img = testimage("house.tif");
mosaicview(my_img)
#Histogram slike prikazane u nijansama sive možemo dobiti npr. na sledeći način:
#UInt8 ce predstavljati tip podataka tj. opseg vrednosti u kojem želimo da predstavimo vrednosti intenziteta
#osvetljaja našeg piksela
histogram(vec(reinterpret(UInt8, my_img)))
#Ukoliko radimo sa npr. slikom u RGB formatu, i želimo da vidimo kako bi izgledao njen histogram osvetljaja, to
#možemo uraditi na sledeći način:
my_img = testimage("coffee.png");
my_img2 = Gray.(my_img);
mosaicview(my_img, my_img2)
histogram(vec(reinterpret(UInt8, my_img2)))
# Ekvalizacija histograma predstavlja pokušaj da se histogram učini što
#uniformnijim po vrednosti intenziteta piksela po svim mogućim
#vrednostima piksela. Na primer, pokušajmo da izvršimo ekvalizaciju histograma
#nad prvom slikom u ovoj svesci:
my_img = testimage("house.tif");
my_img = Gray.(my_img);
equalized_img = adjust_histogram(my_img, Equalization(nbins = 256));
mosaicview(my_img, equalized_img)
#Pogledajmo sada histogram novodobijene slike
histogram(vec(reinterpret(UInt8, equalized_img)))
#Zaista, vidimo da je histogram novodobijene slike značajno uniformniji nego što je to slučaj sa originalnom slikom.
#Ono gde ekvalizacija histograma ima veliku primenu jeste popravka kontrasta slike.
my_img = load("problem_kontrast.jpg")
histogram(vec(reinterpret(UInt8, my_img)))
#Zaista, vidimo da je opseg vrednosti intenziteta piskela od otprilike
#vrednosti 10 do otprilike vrednosti intenziteta 80, što predstavlja problem niskog kontrasta. Za rešavanje ovog
#problema sjajnu mogućnost predstavlja mogućnost ekvalizacije histograma:
equalized_img = adjust_histogram(my_img, Equalization(nbins = 256));
mosaicview(my_img, equalized_img)
#Zaista, vidimo sjajno popravljanje kontrasta kod date slike. Za kraj daćemo prikaz ekvalizovanog histograma
histogram(vec(reinterpret(UInt8, equalized_img)))